﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MRSite.Cache.Generic
{
    public class GenericWrapCache<TKey, TValue> : IGenericCache<TKey, TValue>
    {
        public GenericWrapCache(ICache internalCache)
        {
            InternalCache = internalCache;
        }

        public ICache InternalCache { get; private set; }

        public string Name
        {
            get { return InternalCache.Name; }
        }

        public TimeSpan SlidingExpireTime
        {
            get
            {
                return InternalCache.SlidingExpireTime;
            }
            set
            {
                InternalCache.SlidingExpireTime = value;
            }
        }

        public void Clear()
        {
            InternalCache.Clear();
        }

        public Task ClearAsync()
        {
            return InternalCache.ClearAsync();
        }

        public void Dispose()
        {
            InternalCache.Dispose();
        }

        public TValue Get(TKey key, Func<TKey, TValue> func)
        {
            return InternalCache.Get(key, func);
        }

        public Task<TValue> GetAsync(TKey key, Func<TKey, Task<TValue>> func)
        {
            return InternalCache.GetAsync(key, func);
        }

        public TValue GetOrDefault(TKey key)
        {
            return InternalCache.GetOrDefault<TKey, TValue>(key);
        }

        public Task<TValue> GetOrDefaultAsync(TKey key)
        {
            return InternalCache.GetOrDefaultAsync<TKey, TValue>(key);
        }

        public void Remove(TKey key)
        {
            InternalCache.Remove(key.ToString());
        }

        public Task RemoveAsync(TKey key)
        {
            return InternalCache.RemoveAsync(key.ToString());
        }

        public void Set(TKey key, TValue value, TimeSpan? slidingExpireTime = null)
        {
            InternalCache.Set(key.ToString(), value, slidingExpireTime);
        }

        public Task SetAsync(TKey key, TValue value, TimeSpan? slidingExpireTime = null)
        {
            return InternalCache.SetAsync(key.ToString(), value, slidingExpireTime);
        }
    }
}
